# Модуль 4. Список как изменяемая последовательность

### Введение

Структуры данных – это, по сути, и есть структуры, которые могут хранить некоторые данные вместе.

Другими словами, они используются для хранения связанных данных.

В Python существуют четыре встроенных структуры данных: список, кортеж, словарь и множество.

Посмотрим, как ими пользоваться, и как они могут облегчить нам жизнь

## Списки - операторы и функции работы с ними

Список – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов.

Это легко представить, если вспомнить список покупок, в котором перечисляется, что нужно купить, с тем лишь исключением, что в списке покупок каждый элемент обычно размещается на отдельной строке, тогда как в Python они разделяются запятыми.

```python
shoplist = ['яблоки', 'манго', 'морковь', 'бананы']
```

Задать список в программе на Python очень просто, ставятся квадратные скобки и внутри них через запятую перечисляются его элементы:

Как только список создан, можно добавлять, удалять или искать элементы в нём.

Поскольку элементы можно добавлять и удалять, мы говорим, что список – это изменяемый тип данных, т.е. его можно модифицировать.

```python
print('Я должен сделать', len(shoplist), 'покупки.')
print('Покупки:', end=' ')
for item in shoplist:
    print(item, end=' ')
print('\nТакже нужно купить риса.')
shoplist.append('рис')
print('Теперь мой список покупок таков:', shoplist)
print('Отсортирую-ка я свой список')
shoplist.sort()
print('Отсортированный список покупок выглядит так:', shoplist)
print('Первое, что мне нужно купить, это', shoplist[0])
olditem = shoplist[0]
del shoplist[0]
print('Я купил', olditem)
print('Теперь мой список покупок:', shoplist)
```

```python
lst = ["Москва", 1320, 5.8, True, "Тверь", False]
# в том числе и другие, вложенные списки:
lst2 = [1, 2.5, [-1, -2, -3], 4]
# О вложенных списках мы еще будем говорить.
# Если нам нужно создать пустой список, то достаточно записать квадратные скобки без элементов:
a = []
# или, воспользовавшись специальной функцией:
b = list()
# которая создает новый пустой список. Если же ей в качестве аргумента указать другой список:
a = list([True, False])

```

- len() – определение числа элементов в списке (длина списка);
- max() – для нахождения максимального значения;
- min() – для нахождения минимального значения;
- sum() – для вычисления суммы;
- sorted() – для сортировки коллекции.

```python
sum(t)/len(t)
sorted(t)
max(s)
min(s)
sorted(s)
```

## [1 Практика ](/module-4/1_practice.md)


## Операторы списков

При работе со списками часто используются следующие операторы:

- `+` – соединение двух списков в один;
- `*` – дублирование списка;
- `in` – проверка вхождения элемента в список;
- `del` – удаление элемента списка.

## Срезы списков и сравнение списков

```python
lst = ["Москва", "Уфа", "Тверь", "Казань"]
# и мы хотим выбрать из него 2-й и 3-й элементы. Это можно сделать, так:
lst[1:3]
```

```python
[1, 2, 3] == [1, 2, 3]   # True
[1, 2, 3] != [1, 2, 3]   # False
[1, 2, 3] > [1, 2, 3]    # False
#В последнем сравнении получим False,
# т.к. списки равны, но если записать так:
[10, 2, 3] > [1, 2, 3]  # True
```

### Копирование списков

```python
cities = lst[:]
id(lst)
id(cities)
c = list(lst)

```

### Основные методы списков

```python
l.append(x)
l.extend(t)
l.count(x)
l.index(x [,start [,stop]])
l.insert(i,x)
l.remove(x)
sort([key [, reverse]])
a.pop()
end = a.pop()
a.clear()
23 in c[1:3]
# Также можно использовать перегруженный оператор +, который также добавляет переменную в конец вашего спиcка:
collections += [None]
collections += [[1,2,3], (4,5,6), {7,8,9}, 10]

```

## [Практика ](/module-4/1_practice.md)

## Вложенные списки

```python
img[1] = [0, 0, 0, 0, 0]
img[1] = [0] * 5
img[1][:] = [0] * 5
img = [[1, 7, 6, 11, 3], [1, 7, 6, 11, 3], [1, 7, 6, 11, 3], [1, 7, 6, 11, 3], [1, 7, 6, 11, 3]]

t = [["Люблю", "тебя", "Петра", "творенье"],
     ["Люблю", "твой", "строгий", "стройный", "вид"],
     ["Невы", "державное", "теченье"],
     ["Береговой", "ее", "гранит"]
     ]

A = [[[True, False], [1, 2, 3]], ["матрица", "вектор"]]     
```


# Генераторы списков (List comprehensions)

```python
a = [1 for x in range(N)]
a = [x % 4 for x in range(N)]
a = [0.5*x+1 for x in range(N)]

d_inp = list(map(int, input("Целые числа через пробел: ").split()))

N = 6
a = [0] * N
 
for i in range(N):
    a[i] = i ** 2
 
print(a)

a = [x ** 2 for x in range(N)]


cities = ["Москва", "Тверь", "Рязань", "Ярославль", "Владимир"]
a = [city for city in cities if len(city) < 7]


a = ["четное" if x % 2 == 0 else "нечетное" for x in d]


Используя этот подход, мы можем, например, сформировать таблицу умножения:
a = [f"{i}*{j} = {i*j}"
     for i in range(1, 4)
     for j in range(1, 4)
]

Или, двумерный список превратить в одномерный:
matrix = [[0, 1, 2, 3],
          [10, 11, 12, 13],
          [20, 21, 22, 23]]
 
a = [x
     for row in matrix
     for x in row
]
```


 ## Модуль random

```python
import time
from random import *



N = [1 for i in range(5)]
print(N)

seed(1) # хотите я угадаю вашу случайную (псевдо) последовательность

N = [random() for i in range(5)]
print(N)

# Она при каждом вызове выдает случайное значение в диапазоне [0.0; 1.0). 
# Обратите внимание, что числа подчиняются равномерному закону распределения, то есть, в диапазоне [0.0; 1.0) 
# они могут принимать любое значение с равной вероятностью.

# равномерному закону распределения
N = [randint(0,5) for i in range(5)]
print(N)

# uniform(a, b) также генерирует случайные значения по равномерному закону
N= [uniform(0,10) for i in range(5)]
print(N)

N= [gauss(1.0,0.5) for i in range(5)]
print(N)

# Однако часто на практике требуются случайные величины с другим законом распределения – гауссовским (или, еще говорят, нормальным)
# ему часто подчиняются многие реальные события: колебания цен на нефть,  и различных товаров, шумы при радиопередачах, погрешности измерений различных значений и тп

N= [randrange(0,100,10) for i in range(5)]
print(N)

N = sample(N,3)
print(N)

while True:
    shuffle(N)
    print(N)
    time.sleep(1)

```


## [Практика ](/module-4/1_practice.md)

## [Домашка](/module-4/2_homework.md)